package stacktest;

import java.util.ArrayList;
import java.util.Arrays;

public class MyStack<E> {
    public E[] elem;
    public int usedSize;
    public MyStack(){
        this.elem=(E[])new Object[5];//正常通过反射暂时这么写
    }

    /**
     * 入栈
     * @param val
     */
    public void push(E val){
        if(isFull()){
            this.elem= Arrays.copyOf(this.elem,2*this.usedSize);
        }

        this.elem[this.usedSize++]=val;
    }

    /**
     * 判断当前栈是否为满
     * @return
     */
    public boolean isFull(){
        return usedSize==elem.length;
    }

    /**
     * 出栈且删除出栈元素
     * @return
     */
    public E pop(){
        if(empty()){
            throw new RuntimeException("栈为空");
        }
        E ret = elem[usedSize-1];
        elem[usedSize-1]=null;//引用类型不写这句话会内存泄露
        usedSize--;
        return ret;
    }
    public boolean empty(){
        return usedSize==0;
    }

    /**
     * 获取栈顶元素 不删除
     * @return
     */
    public E peek(){
        if(empty()){
            throw new RuntimeException("栈为空");
        }
        return this.elem[usedSize-1];
    }

    /**
     * 获取大小
     * @return
     */
    public int getUsedSize(){
        return usedSize;
    }
}
